import {Vector3} from '../math/Vector3.js'
import {Object3D} from '../core/Object3D.js'
import {Line} from '../objects/Line.js'
import {Float32BufferAttribute} from '../core/BufferAttribute.js'
import {BufferGeometry} from '../core/BufferGeometry.js'
import {LineBasicMaterial} from '../materials/LineBasicMaterial.js'

const _v1 = /*@__PURE__*/ new Vector3()
const _v2 = /*@__PURE__*/ new Vector3()
const _v3 = /*@__PURE__*/ new Vector3()

class DirectionalLightHelper extends Object3D {
  constructor(light, size, color) {
    super()
    this.light = light
    this.light.updateMatrixWorld()

    this.matrix = light.matrixWorld
    this.matrixAutoUpdate = false

    this.color = color

    if (size === undefined) size = 1

    let geometry = new BufferGeometry()
    geometry.setAttribute('position', new Float32BufferAttribute([-size, size, 0, size, size, 0, size, -size, 0, -size, -size, 0, -size, size, 0], 3))

    const material = new LineBasicMaterial({fog: false, toneMapped: false})

    this.lightPlane = new Line(geometry, material)
    this.add(this.lightPlane)

    geometry = new BufferGeometry()
    geometry.setAttribute('position', new Float32BufferAttribute([0, 0, 0, 0, 0, 1], 3))

    this.targetLine = new Line(geometry, material)
    this.add(this.targetLine)

    this.update()
  }

  dispose() {
    this.lightPlane.geometry.dispose()
    this.lightPlane.material.dispose()
    this.targetLine.geometry.dispose()
    this.targetLine.material.dispose()
  }

  update() {
    _v1.setFromMatrixPosition(this.light.matrixWorld)
    _v2.setFromMatrixPosition(this.light.target.matrixWorld)
    _v3.subVectors(_v2, _v1)

    this.lightPlane.lookAt(_v2)

    if (this.color !== undefined) {
      this.lightPlane.material.color.set(this.color)
      this.targetLine.material.color.set(this.color)
    } else {
      this.lightPlane.material.color.copy(this.light.color)
      this.targetLine.material.color.copy(this.light.color)
    }

    this.targetLine.lookAt(_v2)
    this.targetLine.scale.z = _v3.length()
  }
}

export {DirectionalLightHelper}
